﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BegEntities;
using Logic;

namespace CsharpMailApplikation
{
    public partial class Form1 : Form
    {

        MailLogic mail;
        List<Email> mailList;
        int state; //Två tillstånd - 0: Inbox, 1: Utbox

        public Form1()
        {
            InitializeComponent();
            state = 0;
            mail = new MailLogic();
            FillInbox();
        }

        /// <summary>
        /// Fyller MailBoxList med ingående mail
        /// Ingående mail är en List<Email>
        /// </summary>
        public void FillInbox()
        {
            MailListView.Items.Clear();
            ClearMailView();

            BegEntities.MessageBox mbox = BegEntities.MessageBox.Inbox;

            mailList = mail.LoadMessages(mbox);

            if (mailList.Count > 0)
            {
                mailList.SortByDate();

                foreach (Email e in mailList)
                {
                    MailListView.Items.Add(e.Subject);
                }

                CheckIsRead();
            }
            else
            {
                //Om inkorgen är tom läggs följande sträng till i en label ovanför inkorgen.
                BoxInfo.Text += " :Tom korg";
            }

        }

        /// <summary>
        /// Loopar igenom listan med Email-objekt och markerar olästa meddelanden
        /// </summary>
        public void CheckIsRead()
        {
            int index = 0;
            foreach(Email e in mailList) 
            {
                if (e.IsRead == false)
                {
                    MarkAsNotRead(index);
                }
                index++;
            }

        }

        /// <summary>
        /// Fyller MailBoxList med utgående mail
        /// Utgående mail är en List<Email>
        /// </summary>
        public void FillOutbox()
        {
            MailListView.Items.Clear();
            ClearMailView();

            BegEntities.MessageBox mbox = BegEntities.MessageBox.Sent;

            mailList = mail.LoadMessages(mbox);

            foreach (Email e in mailList)
            {
                MailListView.Items.Add(e.Subject);
                Console.WriteLine(e.From);
            }

            //Eftersom vi anser att mail inte ska kunna vara lästa/olästa i utkorgen kallas aldrig metoden CheckIsRead() för utkorgen.

        }

        /// <summary>
        /// Denna metoden hanterar eventet när användaren trycker på ett mail i listan.
        /// Då innehållet i mailet, sedan sker en kontroll: om användaren är i inkorgen -
        /// så ska mailet markeras som läst och bakgrundsfärgen ska återställas.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MailListView_ItemActivate(object sender, EventArgs e)
        {
            int index = MailListView.FocusedItem.Index;
            MailContent.Text = "Avsändare: " + mailList[index].From +  //Skriver ut mailets innehåll
                    "\n" + "Datum: " + mailList[index].Date +
                    "\n" + "Titel: " + mailList[index].Subject +
                    "\n\n" + mailList[index].Message;
            if (state == 0) //Om användaren är i inkorgen ska isRead hanteras dessutom
            {
                if (mailList[index].IsRead == false)
                {
                    mail.ToggleRead(mailList[index].ID, false);
                    MarkAsRead(index);
                }
                    
            }
        }

        /// <summary>
        /// Denna metod kallas på när användaren fyller i (ändrar) värden i textboxen FilterTxt
        /// Då sker en sökningen med det ifyllda värdet i alla mail inkorgen/utkorgen, 
        /// beroende på i vilken användaren befinner sig vid.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FilterTxt_TextChanged(object sender, EventArgs e)
        {
            List<Email> filterList = new List<Email>();

            if (FilterTxt.Text != "")
            {
                List<Email> emails = FilterSearch.Search(state, FilterTxt.Text, mailList); //Fyller en lista med resultatet av sökningen
                MailListView.Items.Clear();

                foreach (Email email in emails) //Foreach loop som lägger till resultatet (en lista med email-objekt)
                {
                    MailListView.Items.Add(email.Subject);
                }

                int resultLength = MailListView.Items.Count;
                BoxInfo.Text = " Sökningen gav " + resultLength + " resultat.";

            }
            else
            {
                //Om tömmer textboxen, alltså inte söker på något så återställs rubriken.
                if (state == 0) { BoxInfo.Text = "Inkorg"; CheckIsRead(); }
                else if (state == 1) {BoxInfo.Text = "Utkorg";}
            }
        }

        /// <summary>
        /// Hämtar och visar inkorgen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InkorgBtn_Click(object sender, EventArgs e)
        {
            state = 0;
            BoxInfo.Text = "Inkorg";
            FillInbox();
        }

        /// <summary>
        /// Hämtar och visar utkorgen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void UtkorgBtn_Click(object sender, EventArgs e)
        {
            state = 1;
            BoxInfo.Text = "Utkorg";
            FillOutbox();
        }

        /// <summary>
        /// Nytt, tomt mail. Öppnas i ett nytt fönster.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void NewBtn_Click(object sender, EventArgs e)
        {
            SendMail sendMail = new SendMail();
            sendMail.Show();
        }

        /// <summary>
        /// Svara på valt mail, skickar med mailet som användaren vill svara på.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void responseBtn_Click_1(object sender, EventArgs e)
        {
            try
            {
                SendMail sendMail = new SendMail(mailList[MailListView.FocusedItem.Index]);
                sendMail.Show();
            }
            catch (NullReferenceException)
            {
                
            }
        }

        /// <summary>
        /// Ta bort valt mail.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void deleteBtn_Click(object sender, EventArgs e)
        {
            try
            {
                if (mail.DeleteMessage(mailList[MailListView.FocusedItem.Index].ID))
                {
                    if (state == 0)
                    {
                        FillInbox();
                    }
                    else if (state == 1)
                    {
                        FillOutbox();
                    }
                    ClearMailView();
                }
            } catch (NullReferenceException)
                {
                }
        }

        /// <summary>
        /// Rensa rutan som visar innehållet i valt mail.
        /// </summary>
        private void ClearMailView()
        {
            MailContent.Text = "";
        }

        private void reloadBtn_Click(object sender, EventArgs e)
        {
            if (state == 0)
            {
                List<Email> emailList = new List<Email>();
                emailList = mail.GetNewMessages();

                if (emailList.Count > 0)
                {

                    foreach (Email email in emailList)
                    {
                        mailList.Add(email);
                        MailListView.Items.Insert(0, email.Subject);
                    }
                    mailList.SortByDate();
                    CheckIsRead();
                    mail.ClearTemp();

                }
            }
        }

        private void setAsNotReadBtn_Click(object sender, EventArgs e)
        {
            int selected = MailListView.FocusedItem.Index;
            MailListView.FocusedItem.Focused = false;
            if (selected != -1)
            {
                mail.ToggleRead(mailList[selected].ID, true);
                MarkAsNotRead(selected);
                ClearMailView();
            }
        }

        private void MarkAsNotRead(int index)
        {
            mailList[index].IsRead = false;
            MailListView.Items[index].BackColor = Color.SteelBlue;
            MailListView.Items[index].ForeColor = Color.White;
        }

        private void MarkAsRead(int index)
        {
            mailList[index].IsRead = true;
            MailListView.Items[index].BackColor = Color.White;
            MailListView.Items[index].ForeColor = Color.Black;
        }
    }
}
